export type Pair<V, K extends string = string> = { label: K; value: V };

/**
 * # UUID
 */
export type UuidType = string;
/**
 * # ID
 */
export type IdType = UuidType | number;
// noinspection JSUnusedGlobalSymbols
/**
 * # json字符串
 */
export type JsonStr = string;
/**
 * # 表单域标识
 */
export type FieldName = string;
/**
 * # url字符串
 */
export type UrlStr = string | undefined;
/**
 * # 标量
 */
export type Scalar = string | number;
// noinspection JSUnusedGlobalSymbols
/**
 * # 图层
 */
export type LayerType = string;

/**
 * # 尺寸
 */
export type SizeType = 'xs' | 'sm' | 'md' | 'lg';
// noinspection JSUnusedGlobalSymbols
export const sizes: Pair<SizeType>[] = [
    {
        label: '微型',
        value: 'xs',
    },
    {
        label: '小型',
        value: 'sm',
    },
    {
        label: '中型',
        value: 'md',
    },
    {
        label: '大型',
        value: 'lg',
    },
];
/**
 * # 外观颜色
 */
export type ThemeType = 'normal' | 'primary' | 'success' | 'warning' | 'danger';
export const themes: Pair<ThemeType>[] = [
    {
        label: '无色',
        value: 'normal',
    },
    {
        label: '普通色',
        value: 'primary',
    },
    {
        label: '成功绿',
        value: 'success',
    },
    {
        label: '警告黄',
        value: 'warning',
    },
    {
        label: '醒目红',
        value: 'danger',
    },
];
/**
 * # 外观效果
 */
export type FaceType = 'dark' | 'light' | 'plain';
// noinspection JSUnusedGlobalSymbols
export const faces: Pair<FaceType>[] = [
    {
        label: '深色',
        value: 'dark',
    },
    {
        label: '浅色',
        value: 'light',
    },
    {
        label: '文字',
        value: 'light',
    },
];
/**
 * # 边框
 */
export type BorderType = 'solid' | 'dashed' | 'dotted';
// noinspection JSUnusedGlobalSymbols
export const borders: Pair<BorderType>[] = [
    {
        label: '线框',
        value: 'solid',
    },
    {
        label: '短线',
        value: 'dashed',
    },
    {
        label: '点线',
        value: 'dotted',
    },
];
/**
 * # 外形
 */
export type ShapeType = 'square' | 'round' | 'circle';
// noinspection JSUnusedGlobalSymbols
export const shapes: Pair<ShapeType>[] = [
    {
        label: '方形',
        value: 'square',
    },
    {
        label: '圆角',
        value: 'round',
    },
    {
        label: '圆形',
        value: 'circle',
    },
];

/**
 * # 图标
 */
export type IconType = string;
// noinspection JSUnusedGlobalSymbols
/**
 * # 样式
 */
export type StyleType = Record<string, unknown>;

/**
 * # 数据元
 */
export type IValues = Record<string, unknown>;
/**
 * # 一行数据库数据
 */
export interface Row<D extends IdType = number> extends IValues {
    id: D;
}
// noinspection JSUnusedGlobalSymbols
/**
 * # 多行数据库数据
 */
export type Rows = Row[];

// noinspection JSUnusedGlobalSymbols
/**
 * # 基本数据类型
 */
export type Pascal =
    | 'bool'
    | 'relation'
    | 'int'
    | 'str'
    | 'password'
    | 'phone'
    | 'email'
    | 'text'
    | 'card'
    | 'select'
    | 'mark'
    | 'time'
    | 'date'
    | 'datetime'
    | 'decimal'
    | 'ip'
    | 'file'
    | 'img';

/**
 * # 表单域类型
 */
export type WidgetType =
    | 'label'
    | 'switch'
    | 'num'
    | 'auto'
    | 'input'
    | 'password'
    | 'repeat'
    | 'card'
    | 'email'
    | 'phone'
    | 'text'
    | 'decimal'
    | 'checkbox'
    | 'radio'
    | 'select'
    | 'remote'
    | 'tree'
    | 'color'
    | 'rate'
    | 'icon'
    | 'time'
    | 'date'
    | 'file'
    | 'img'
    | 'options'
    | 'group'
    | 'hr';

/**
 * ## 表格单元格类型
 */
export type CellType =
    /**
     * 身份证
     */
    | 'card2age'
    | 'card2sex'
    | 'card2birth'
    /**
     * 生日
     */
    | 'birth2age'
    /**
     * tree
     */
    | 'tree'
    /**
     * icon
     */
    | 'icon'
    /**
     * switch
     */
    | 'switch'
    /**
     * tag
     */
    | 'tag'
    /**
     * mark
     */
    | 'mark'
    /**
     * 配置前后缀
     */
    | 'fix'
    /**
     * 显示一个A标签
     */
    | 'url'
    /**
     * 显示一个点击预览按钮
     */
    | 'pic'
    /**
     * 显示一个Pdf下载按钮
     */
    | 'pdf'
    | 'black'
    | 'span'
    | 'gender'
    | 'operator';

/**
 * # 比较操作
 */
export type IntCompare = '<' | '>' | '<=' | '>=';
export type MultiCompare = '&' | '&=';
export type StrCompare = 'LIKE' | 'NOT-LIKE';
export type InCompare = 'IN' | 'NOT-IN';
export type NullCompare = 'NOT-NULL' | 'NULL';
// noinspection JSUnusedGlobalSymbols
export const intCompares: Array<IntCompare | '='> = ['<', '>', '<=', '>=', '='];
// noinspection JSUnusedGlobalSymbols
export const multiCompares: Array<MultiCompare | '='> = ['&', '&=', '='];
// noinspection JSUnusedGlobalSymbols
export const strCompares: Array<StrCompare | '='> = ['LIKE', 'NOT-LIKE', '='];
export type CompareType = IntCompare | MultiCompare | InCompare | NullCompare | StrCompare | '=';
// noinspection JSUnusedGlobalSymbols
/**
 * ## 操作符名称
 */
export const compares: Record<CompareType, string> = {
    '&': '获得',
    '&=': '同时获得',
    '<': '小于',
    '<=': '小于等于',
    '=': '等于',
    '>=': '大于等于',
    '>': '大于',
    IN: '包含',
    'NOT-IN': '不包含',
    LIKE: '存在',
    'NOT-LIKE': '不存在',
    NULL: '为空',
    'NOT-NULL': '不为空',
};
/**
 * ## 复杂查询参数
 */
export type ValueComputerType =
    | /* 身份证 */ 'card'
    | /* 之前   */ 'prev'
    | /* 当前   */ 'current'
    | /* 之后   */ 'next'
    | /* 关联   */ 'relation';
// noinspection JSUnusedGlobalSymbols
export type ComputedParam =
    | /* 当时   */ 'time'
    | /* 本日   */ 'day'
    | /* 本周   */ 'week'
    | /* 本月   */ 'month'
    | /* 当年   */ 'year'
    | /* 身份证转性别 */ 'cx'
    | /* 身份证转生日 */ 'cb'
    | /* 身份证转年龄 */ 'ca';

// noinspection JSUnusedGlobalSymbols
/**
 * # 简单查询
 */
export type QueryParams = Record<FieldName, Scalar | Scalar[]>;

/**
 * # json查询索引
 */
export const JSON_QUERY_INDEX = 'filter';
/**
 * ## 查询因子
 */
export interface QueryFactor {
    /**
     * 运算符
     */
    operator?: CompareType;
    /**
     * 参数为运算值
     */
    computed?: ValueComputerType;
}
/**
 * # 查询元
 */
export interface QueryTuple extends QueryFactor {
    id: UuidType;
    /**
     * 查询的域
     */
    field: FieldName;
}
/**
 * ## 查询元素
 */
export interface QueryItem extends QueryTuple {
    /**
     * 查询值
     */
    value: unknown;
}

/**
 * # 基本
 */
export interface Aoe {
    /**
     * uuid
     */
    id?: UuidType;
    /**
     * 标签
     */
    label?: string;
}

export interface NamedAoe<T extends string = UuidType> extends Aoe {
    name: T;
}

/**
 * # 选项
 */
export type OptionItem = Pair<Scalar>;
/**
 * # 选项组
 */
export type OptionPairs = OptionItem[];

/**
 * # 多选
 */
export interface Multiple {
    /**
     * 多选
     */
    multiple?: boolean;
}

/**
 * # 有选项的元件
 */
export interface ISelectable {
    /**
     * 选项
     */
    options?: OptionPairs | UrlStr;
}

/**
 * # 树结构选项
 */
export interface TreeOptionItem extends OptionItem {
    children?: TreeOptionItem[];
}

/**
 * # When参数格式
 */
export type WhenItem = boolean | Scalar[] | Scalar;
/**
 * # 条件信息
 */
export type WhenType = Record<FieldName, WhenItem>;

/**
 * # 可以disable的组件配置项
 */
export interface IDisability {
    /**
     * ## 优先级高
     */
    disabled?: boolean;

    /**
     * When语句
     */
    when?: WhenType;
}
